package com.vcc.core.util;

import cn.hutool.core.io.file.FileReader;
import cn.hutool.core.text.StrBuilder;
import cn.hutool.core.util.IdUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONObject;
import org.springframework.core.io.ClassPathResource;

import java.util.Arrays;
import java.util.List;
import java.util.Map;

public class CardholderUtil {


    private static final String LOWERCASE_ALPHABET = "abcdefghijklmnopqrstuvwxyz";
    private static final String UPPERCASE_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    private static final List<String> US_MOBILE_AERO_CODE = List.of(
            "917", "541", "206", "702", "515", "740", "615", "201", "443", "812",
            "480", "773", "786", "469", "757", "213", "717"
    );

    //AL、AK、AZ、AR、CA、CO、CT、DE、FL、GA、HI、ID、IL、IN、IA、KS、KY、LA、ME、MD、MA、MI、MN、MS、MO、MT、NE、NV、NH、NJ、NM、NY、NC、ND、OH、OK、OR、PA、RI、SC、SD、TN、TX、UT、VT、VA、WA、WV、WI、WY。
    private static final List<String> US_STATE_LIST = List.of(
            "AL", "AK", "AZ", "AR", "CA", "CO", "CT", "DE", "FL", "GA",
            "HI", "ID", "IL", "IN", "IA", "KS", "KY", "LA", "ME", "MD",
            "MA", "MI", "MN", "MS", "MO", "MT", "NE", "NV", "NH", "NJ",
            "NM", "NY", "NC", "ND", "OH", "OK", "OR", "PA", "RI", "SC",
            "SD", "TN", "TX", "UT", "VT", "VA", "WA", "WV", "WI", "WY"
    );


    private static final List<String> EMAIL_SUFFIX = List.of("@allwins-ads.com");


    private static final Map<String, List<String>> AREA_CODES_MAP;

    static {
        AREA_CODES_MAP = Map.ofEntries(
                Map.entry("AL", Arrays.asList("205", "251", "256", "334", "938")),
                Map.entry("AK", List.of("907")),
                Map.entry("AZ", Arrays.asList("480", "520", "602", "623", "928")),
                Map.entry("AR", Arrays.asList("479", "501", "870")),
                Map.entry("CA", Arrays.asList("209", "213", "279", "310", "323", "408", "415", "424", "442", "510", "530", "559", "562", "619", "626", "628", "650", "657", "661", "669", "707", "714", "747", "760", "805", "818", "820", "831", "858", "909", "916", "925", "949", "951")),
                Map.entry("CO", Arrays.asList("303", "719", "720", "970")),
                Map.entry("CT", Arrays.asList("203", "475", "860", "959")),
                Map.entry("DE", Arrays.asList("302")),
                Map.entry("DC", Arrays.asList("202")),
                Map.entry("FL", Arrays.asList("239", "305", "321", "352", "386", "407", "561", "727", "754", "772", "786", "813", "850", "863", "904", "941", "954")),
                Map.entry("GA", Arrays.asList("229", "404", "470", "478", "678", "706", "762", "770", "912")),
                Map.entry("HI", Arrays.asList("808")),
                Map.entry("ID", Arrays.asList("208", "986")),
                Map.entry("IL", Arrays.asList("217", "224", "309", "312", "331", "618", "630", "708", "773", "779", "815", "847", "872")),
                Map.entry("IN", Arrays.asList("219", "260", "317", "463", "574", "765", "812", "930")),
                Map.entry("IA", Arrays.asList("319", "515", "563", "641", "712")),
                Map.entry("KS", Arrays.asList("316", "620", "785", "913")),
                Map.entry("KY", Arrays.asList("270", "364", "502", "606", "859")),
                Map.entry("LA", Arrays.asList("225", "318", "337", "504", "985")),
                Map.entry("ME", Arrays.asList("207")),
                Map.entry("MD", Arrays.asList("227", "240", "301", "410", "443", "667")),
                Map.entry("MA", Arrays.asList("339", "351", "413", "508", "617", "774", "781", "857", "978")),
                Map.entry("MI", Arrays.asList("231", "248", "269", "313", "517", "586", "616", "734", "810", "906", "947", "989")),
                Map.entry("MN", Arrays.asList("218", "320", "507", "612", "651", "763", "952")),
                Map.entry("MS", Arrays.asList("228", "601", "662", "769")),
                Map.entry("MO", Arrays.asList("314", "417", "573", "636", "660", "816", "975")),
                Map.entry("MT", Arrays.asList("406")),
                Map.entry("NE", Arrays.asList("308", "402", "531")),
                Map.entry("NV", Arrays.asList("702", "725", "775")),
                Map.entry("NH", Arrays.asList("603")),
                Map.entry("NJ", Arrays.asList("201", "551", "609", "640", "732", "848", "856", "862", "908", "973")),
                Map.entry("NM", Arrays.asList("505", "575")),
                Map.entry("NY", Arrays.asList("212", "315", "332", "347", "516", "518", "585", "607", "631", "646", "680", "716", "718", "838", "845", "914", "917", "929", "934")),
                Map.entry("NC", Arrays.asList("252", "336", "704", "743", "828", "910", "919", "980", "984")),
                Map.entry("ND", Arrays.asList("701")),
                Map.entry("OH", Arrays.asList("216", "220", "234", "330", "380", "419", "440", "513", "567", "614", "740", "937")),
                Map.entry("OK", Arrays.asList("405", "539", "580", "918")),
                Map.entry("OR", Arrays.asList("458", "503", "541", "971")),
                Map.entry("PA", Arrays.asList("215", "223", "267", "272", "412", "445", "484", "570", "582", "610", "717", "724", "814", "878")),
                Map.entry("RI", Arrays.asList("401")),
                Map.entry("SC", Arrays.asList("803", "843", "854", "864")),
                Map.entry("SD", Arrays.asList("605")),
                Map.entry("TN", Arrays.asList("423", "615", "629", "731", "865", "901", "931")),
                Map.entry("TX", Arrays.asList("210", "214", "254", "281", "325", "346", "361", "409", "430", "432", "469", "512", "682", "713", "726", "737", "806", "817", "830", "832", "903", "915", "936", "940", "945", "956", "972", "979")),
                Map.entry("UT", Arrays.asList("385", "435", "801")),
                Map.entry("VT", Arrays.asList("802")),
                Map.entry("VA", Arrays.asList("276", "434", "540", "571", "703", "757", "804", "948")),
                Map.entry("WA", Arrays.asList("206", "253", "360", "425", "509", "564")),
                Map.entry("WV", Arrays.asList("304", "681")),
                Map.entry("WI", Arrays.asList("262", "274", "414", "534", "608", "715", "920")),
                Map.entry("WY", Arrays.asList("307")));
    }


    public static String createName(Integer length) {
        StringBuilder name = new StringBuilder();
        for (int i = 0; i < length; i++) {
            if (i == 0) {
                int index = (int) (Math.random() * UPPERCASE_ALPHABET.length());
                name.append(UPPERCASE_ALPHABET.charAt(index));
            } else {
                int index = (int) (Math.random() * LOWERCASE_ALPHABET.length());
                name.append(LOWERCASE_ALPHABET.charAt(index));
            }
        }
        return name.toString();
    }

    public static JSONObject getUsAddress() {
        try {
            List<JSONObject> list = JSONUtil.toList(new FileReader(new ClassPathResource("./openCardAddressInfo.json").getFile()).readString(),
                    JSONObject.class);
            return list.get((int) (Math.random() * list.size()));
        } catch (Exception e) {
            JSONObject address = new JSONObject();
            address.put("address", "1289 PopeLickMonster Ave");
            address.put("city", "DAN");
            address.put("state", "CT");
            address.put("zipcode", "06854"); // 生成5位数邮政编码
            address.put("mobilePrefix", "01");
            address.put("mobile", createUsMobile()); // 生成7位数手机号后缀
            return address;
        }
    }

    //生成1990-01-01到2000-12-31之间的随机日期
    public static String createBirthday() {
        int year = 1990 + (int) (Math.random() * 11); // 1990-2000
        int month = 1 + (int) (Math.random() * 12); // 1-12
        int day = 1 + (int) (Math.random() * 28); // 1-28, 避免2月29日问题
        return String.format("%04d-%02d-%02d", year, month, day);
    }

    //生成美国手机号码 格式要求没有 第一位数不能是1
    public static String createUsMobile() {
        StrBuilder mobile = new StrBuilder();
        String state = US_STATE_LIST.get((int) (Math.random() * US_STATE_LIST.size()));
        List<String> areaCodes = AREA_CODES_MAP.get(state);
        mobile.append(areaCodes.get((int) (Math.random() * areaCodes.size())));
        mobile.append((int) (Math.random() * 900 + 100)); // 3位数
        mobile.append((int) (Math.random() * 9000 + 1000)); // 4位数
        return mobile.toString();
    }

    public static String createRandomEmail() {
        return createRandomEmail(IdUtil.getSnowflakeNextIdStr());
    }

    public static String createRandomEmail(String prefix) {
        //获取邮箱集合内的后缀拼接前缀
        if (EMAIL_SUFFIX.size() == 1) {
            return prefix + EMAIL_SUFFIX.get(0);
        } else {
            String emailSuffix = EMAIL_SUFFIX.get((int) (Math.random() * EMAIL_SUFFIX.size()));
            return prefix + emailSuffix;
        }
    }


}

